package com.hx.pojo;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Aspect
//开启生成代理对象的配置
@EnableAspectJAutoProxy
@Order(2)
public class UserProxy {
    //
    @Pointcut(value = "execution(* com.hx.pojo.User.add(..))")
    public void pointcut(){

    }


    //前置通知  细粒度：准确定位指定包类下的方法

    //后置通知  细粒度：扫描指定包类下的所有方法
    //设置优先级

    @After(value = "execution(* com.hx.pojo.User.add(..))")
    public void after(){
        System.out.println("后置通知，在目标方法执行之后执行");
    }
    //返回通知
    @AfterReturning(value = "execution(* com.hx.pojo.User.add(..))")
    public void aftreReturning(){
        System.out.println("返回通知，在目标方法返回结果前时执行");
    }
    //异常通知
    @AfterThrowing(value = "execution(* com.hx.pojo.User.cherData(..))")
    public void afterThrowing(){
        System.out.println("afterThrowing...在目标方法执行发生异常执行");
    }
    //环绕通知
    @Around(value = "execution(* com.hx.pojo.User.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕通知，目标方法执行之前执行");
        //目标方法执行
        proceedingJoinPoint.proceed();
        System.out.println("环绕通知，目标方法执行之后增强功能");
    }
}
